【MySQL】テーブルの複製(CREATE TABLE [ LIKE | SELECT FROM ] )
MySQLのテーブル複製について解説します。
検証環境
テーブル複製
既存のテーブルを複製して、新しいテーブルの作成が可能です。
作成方法はデータも複製するかどうかで2つのパターンがあります。
データの複製なし
データの複製はなし、つまりテーブル定義のみ複製する場合は、CREATE TABLE LIKE
文を使います。
基本構文
CREATE TABLE 複製テーブル名 LIKE 複製元テーブル名
サンプル
mysql> DESC items;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
| price | int | YES | | NULL | |
| stock | int | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql> SELECT * FROM items;
+----+-----------+-------+-------+
| id | name | price | stock |
+----+-----------+-------+-------+
| 1 | Apple | 200 | 10 |
| 2 | Orange | 150 | 3 |
| 3 | Pineapple | 1100 | 3 |
| 4 | Grapes | 3500 | 1 |
+----+-----------+-------+-------+
4 rows in set (0.00 sec)
___ih_hl_start
mysql> CREATE TABLE fruits LIKE items;
___ih_hl_end
Query OK, 0 rows affected (0.01 sec)
mysql> DESC fruits;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
| price | int | YES | | NULL | |
| stock | int | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql> SELECT * FROM fruits;
Empty set (0.00 sec)
23行目でitems
テーブルからfruits
テーブルを複製しています。
データの複製あり
データも複製する場合は、CREATE TABLE SELECT FROM
文を使います。
基本構文
CREATE TABLE 複製テーブル名 SELECT 複製カラム FROM 複製元テーブル名
サンプル
mysql> DESC items;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
| price | int | YES | | NULL | |
| stock | int | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)
mysql> SELECT * FROM items;
+----+-----------+-------+-------+
| id | name | price | stock |
+----+-----------+-------+-------+
| 1 | Apple | 200 | 10 |
| 2 | Orange | 150 | 3 |
| 3 | Pineapple | 1100 | 3 |
| 4 | Grapes | 3500 | 1 |
+----+-----------+-------+-------+
4 rows in set (0.00 sec)
___ih_hl_start
mysql> CREATE TABLE fruits SELECT * FROM items;
___ih_hl_end
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> DESC fruits;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | | 0 | |
| name | varchar(20) | YES | | NULL | |
| price | int | YES | | NULL | |
| stock | int | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
mysql> SELECT * FROM fruits;
+----+-----------+-------+-------+
| id | name | price | stock |
+----+-----------+-------+-------+
| 1 | Apple | 200 | 10 |
| 2 | Orange | 150 | 3 |
| 3 | Pineapple | 1100 | 3 |
| 4 | Grapes | 3500 | 1 |
+----+-----------+-------+-------+
4 rows in set (0.00 sec)
23行目でitems
テーブルからfruits
テーブルを複製しています。
*
で全てのカラムを指定していますが、特定のカラムのみ指定することも可能です。
___ih_hl_start
mysql> CREATE TABLE fruits SELECT id, name FROM items;
___ih_hl_end
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM fruits;
+----+-----------+
| id | name |
+----+-----------+
| 1 | Apple |
| 2 | Orange |
| 3 | Pineapple |
| 4 | Grapes |
+----+-----------+
4 rows in set (0.00 sec)